/** 主要放置工具类函数 方便调用 */
import ColorThief from "colorthief";
import { getHYYResource, getXWResource } from "@/api/courseVideo.js";

/**
 * 从图片中提取颜色（获取图片的主要3种颜色）
 * @param {string} imageUrl - 图片的 URL
 * @returns {Promise<Array<string>>} - 包含RGB格式的颜色字符串的数组
 */
export async function updateImageColors(imageUrl) {
  const bgColors = [];
  const image = new Image();
  image.crossOrigin = "anonymous";
  image.src = imageUrl;

  try {
    await new Promise((resolve, reject) => {
      image.onload = resolve; // 当图片加载完成时执行 resolve
      image.onerror = reject; // 当加载出错时执行 reject
    });

    const colorThief = new ColorThief();
    let colors = colorThief.getPalette(image, 3); // 获取图片的主要3种颜色
    bgColors.splice(
      0,
      bgColors.length,
      ...colors.map((c) => `rgb(${c[0]}, ${c[1]}, ${c[2]})`)
    );
    // 将颜色转换为 RGB 格式的字符串并存入数组
    return bgColors; // 返回提取到的颜色数组
  } catch (error) {
    console.error("Error loading image:", error); // 输出加载图片时的错误信息
    return []; // 确保错误时返回空数组
  }
}

/**
 * 预加载图片函数
 * @param {string} url - 需要预加载的图片链接
 */
export function preloadImage(url) {
  const img = new Image();
  img.src = url;
}

/**
 * 更新粗略视频字段结构
 * @param {Object} dataArray - 包含要更新的数据的对象
 * @param {Array} videoClass - 视频类别数组
 * @param {string} subject - 要更新的专业
 */
export function updateRoughVideoData(dataArray, videoClass, subject) {
  const arr = videoClass.reduce((result, element) => {
    return result.concat(element.videoResource);
  }, []);

  if (arr.length > 6) {
    let randomNums = generateUniqueRandomArray(arr, []);
    randomNums = generateUniqueRandomArray(arr, randomNums);
    const newArr = randomNums.map((index) => arr[index]);
    newArr.forEach((item, index) => {
      item.sortId = index + 1;
      item.id = subject;
    });
    dataArray.imgGroup = [...newArr];
  } else {
    arr.forEach((item, index) => {
      item.sortId = index + 1;
      item.id = subject;
    });
    dataArray.imgGroup = [...arr];
  }
}

/**
 * 生成指定范围内的随机整数
 * @param {number} min - 最小值（包含）
 * @param {number} max - 最大值（不包含）
 * @returns {number} 生成的随机整数
 */
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min) + min);
}

/**
 * 生成不重复的随机数数组
 * @param {array} arr - 输入的数组
 * @param {array} exclude - 需要排除的数组
 * @returns {array} 不重复的随机数数组
 */
function generateUniqueRandomArray(arr, exclude) {
  const nums = new Set(exclude);
  while (nums.size < 6) {
    let num = getRandomInt(0, arr.length);
    nums.add(num);
  }
  return Array.from(nums);
}

/**
 * 处理后端视频数据
 * @param {string} subject - 专业名称
 */
export async function processBackEndData(subject) {
  if (typeof subject !== "string") {
    throw new Error('Input parameter "subject" must be a string');
  }

  let callSubjectApi = null;
  if (subject === "hanyuyan") {
    callSubjectApi = getHYYResource();
  } else if (subject === "xinwen") {
    callSubjectApi = getXWResource();
  } else {
    // 这个是网新的api 因暂时没有视频资源 所以先注释
    // callSubjectApi = getWXResource()
    return;
  }

  try {
    const res = await callSubjectApi;
    if (res.status === 200) {
      const totalData = res.data.data;
      const arr = [];

      totalData.forEach((item) => {
        arr.push(item.attributes.videoResource);
      });
      return arr;
    } else alert("数据请求错误，请联系管理员");
  } catch (err) {
    console.log(err);
    // 可以在这里执行一些错误处理逻辑
  } finally {
    // 可以在这里执行一些资源清理或者释放操作
  }
}
